package com.example.myblog.service;

import com.example.myblog.model.Category;
import com.example.myblog.model.Post;
import com.example.myblog.model.User;
import com.example.myblog.repository.PostRepository;
import com.example.myblog.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 文章管理的业务逻辑服务
 */
@Service
public class PostService {

    @Autowired
    private PostRepository postRepository;

    @Autowired
    private OssService ossService;

    @Autowired
    private UserRepository userRepository;

    /**
     * 获取所有文章，按创建时间降序排列
     * 
     * @return 文章列表
     */
    public List<Post> getAllPosts() {
        return postRepository.findAllByOrderByCreatedAtDesc();
    }

    /**
     * 根据分类获取文章，按创建时间降序排序
     * 
     * @param category 文章分类
     * @return 指定分类的文章列表
     */
    public List<Post> getPostsByCategory(Category category) {
        return postRepository.findByCategoryOrderByCreatedAtDesc(category);
    }

    /**
     * 根据ID获取单篇文章，并增加访问量
     * 
     * @param id 文章ID
     * @return 文章对象，如果不存在则返回null
     */
    public Post getPostById(Long id) {
        Post post = postRepository.findById(id).orElse(null);
        if (post != null) {
            // 增加访问量
            post.setViewCount(post.getViewCount() + 1);
            postRepository.save(post);
        }
        return post;
    }

    /**
     * 创建新文章
     * 
     * @param post      文章对象
     * @param imageFile 封面图片文件
     * @param username  创建者用户名
     * @return 保存后的文章对象
     */
    public Post createPost(Post post, MultipartFile imageFile, String username) {
        // 如果上传了图片，则上传到OSS并设置URL
        if (imageFile != null && !imageFile.isEmpty()) {
            String imageUrl = ossService.uploadFile(imageFile);
            post.setCoverImageUrl(imageUrl);
        }

        // 设置创建时间
        post.setCreatedAt(LocalDateTime.now());

        // 设置作者
        if (username != null) {
            User author = userRepository.findByUsername(username).orElse(null);
            if (author != null) {
                post.setAuthor(author);
            }
        }

        // 保存文章
        return postRepository.save(post);
    }

    /**
     * 更新文章
     * * @param id 文章ID
     * 
     * @param updatedPost 更新后的文章对象
     * @param imageFile   新的封面图片文件（可选）
     * @param username    更新者用户名
     * @param deleteImage 是否删除当前图片
     * @return 更新后的文章对象，如果文章不存在则返回null
     */
    public Post updatePost(Long id, Post updatedPost, MultipartFile imageFile, String username, boolean deleteImage) {
        // 查找现有文章
        Post existingPost = postRepository.findById(id).orElse(null);

        if (existingPost != null) {
            // 更新文章信息
            existingPost.setTitle(updatedPost.getTitle());
            existingPost.setContent(updatedPost.getContent());

            // 设置分类
            existingPost.setCategory(updatedPost.getCategory());

            // 如果需要删除图片
            if (deleteImage) {
                existingPost.setCoverImageUrl(null);
            }
            // 如果上传了新图片，则上传到OSS并更新URL
            else if (imageFile != null && !imageFile.isEmpty()) {
                String imageUrl = ossService.uploadFile(imageFile);
                existingPost.setCoverImageUrl(imageUrl);
            }

            // 保存更新后的文章
            return postRepository.save(existingPost);
        }

        return null;
    }

    /**
     * 删除文章
     * 
     * @param id 文章ID
     */
    public void deletePost(Long id) {
        postRepository.deleteById(id);
    }
    
    /**
     * 获取访问量前五的文章（阅读榜）
     * 
     * @return 按访问量降序排列的前五篇文章
     */
    public List<Post> getTopViewedPosts() {
        return postRepository.findTop5ByOrderByViewCountDesc();
    }
    
    /**
     * 按分类获取访问量前五的文章（阅读榜）
     * 
     * @param category 文章分类
     * @return 指定分类按访问量降序排列的前五篇文章
     */
    public List<Post> getTopViewedPostsByCategory(Category category) {
        return postRepository.findTop5ByCategoryOrderByViewCountDesc(category);
    }
    
    /**
     * 上传图片到OSS，专门用于编辑器内的图片上传
     * 
     * @param imageFile 图片文件
     * @param username  上传者用户名
     * @return 图片的OSS URL
     */
    public String uploadImageToOSS(MultipartFile imageFile, String username) {
        return ossService.uploadFile(imageFile);
    }
    

}